Pandas使用笔记

Pandas是python的一款第三方包,强大,快速,多使用于数据挖掘和整合

我会不定期记录使用pandas的心得

以下内容仅来自于个人经验,可能不是最优使用方式

Here we go

pd中常用的对象: Series, DataFrame

加载csv文件

# 加载,df的数据类型为DataFrame
df = pd.read_csv("16号线坡度表.csv")

# 显示前5行
df.head()

   序号  行别         起点里程         终点里程   坡度(‰)     坡长(m)  起标高(m)  长链(m)  短链(m)  \
0   1  上行  +K00000.000  +K00355.000   2.000   355.002   38.33  0.002    NaN
1   2  上行  +K00355.000  +K00780.000  -2.000   425.000   39.04    NaN    NaN
2   3  上行  +K00780.000  +K01180.000 -28.000   400.000   38.19    NaN    NaN
3   4  上行  +K01180.000  +K01840.000 -19.500   660.000   26.99    NaN    NaN
4   5  上行  +K01840.000  +K02980.000  15.401  1141.220   14.12  1.220    NaN

   Unnamed: 9
0         NaN
1         NaN
2         NaN
3         NaN
4         NaN

DataFrame每一列就是一个Series

df["起点里程"]

0     +K00000.000
1     +K00355.000
2     +K00780.000
3     +K01180.000
         ...
69    +K19450.000
70    +K19720.000
71    +K19980.000
Name: 起点里程, Length: 72, dtype: object

过滤掉不需要的内容

df = df.filter(items=["行别", "起点里程", "终点里程", "坡度(‰)"])
df.head()

   行别         起点里程         终点里程   坡度(‰)
0  上行  +K00000.000  +K00355.000   2.000
1  上行  +K00355.000  +K00780.000  -2.000
2  上行  +K00780.000  +K01180.000 -28.000
3  上行  +K01180.000  +K01840.000 -19.500
4  上行  +K01840.000  +K02980.000  15.401

替换df的列名称

df.columns = ["a", "b", "c", "d"]
df.head()

    a            b            c       d
0  上行  +K00000.000  +K00355.000   2.000
1  上行  +K00355.000  +K00780.000  -2.000
2  上行  +K00780.000  +K01180.000 -28.000
3  上行  +K01180.000  +K01840.000 -19.500
4  上行  +K01840.000  +K02980.000  15.401

对df某一列处理

df["b"] = df["b"].apply(lambda x: float(x[2:]))
df.head()

    a       b            c       d
0  上行     0.0  +K00355.000   2.000
1  上行   355.0  +K00780.000  -2.000
2  上行   780.0  +K01180.000 -28.000
3  上行  1180.0  +K01840.000 -19.500
4  上行  1840.0  +K02980.000  15.401

找出Nan行并过滤掉

# b列3行更新为nan
df["b"][2] = np.nan

# 找出为nan的行
df[df.isnull().values == True]

    a   b            c     d
2  上行 NaN  +K01180.000 -28.0


# 过滤掉nan行
 df[df["b"].isnull().values == False]

拼接多个DataFrame

# 按列拼接
df = pd.concat([df1, df2], axis=1)

# 按行拼接
df = pd.concat([df1, df2], axis=0)

# 按行拼接,忽略索引
df = pd.concat([df1, df2], axis=0, ignore_index=True)

DataFrame转换数据类型

df = df.astype("float32")

将unix时间戳转换成常用时间

df = pd.read_csv("in_file")
print(df.head())

    Timestamp  Weighted_Price
0  1417411980           300.0
1  1417412040           300.0
2  1417412100           300.0
3  1417412160           300.0
4  1417412220           300.0

# pd.to_datetime(df['Timestamp'], unit='s')
# 按秒返回datetime类型
# pd.Series.dt.date 按天返回结果
df['date'] = pd.to_datetime(df['Timestamp'], unit='s').dt.date
print(df.head())

    Timestamp  Weighted_Price        date
0  1417411980           300.0  2014-12-01
1  1417412040           300.0  2014-12-01
2  1417412100           300.0  2014-12-01
3  1417412160           300.0  2014-12-01
4  1417412220           300.0  2014-12-01

聚合

df = pd.read_csv("in_file")
print(df.head())

    Timestamp  Weighted_Price        date
0  1417411980           300.0  2014-12-01
1  1417412040           300.0  2014-12-01
2  1417412100           300.0  2014-12-01
3  1417412160           300.0  2014-12-01
4  1417412220           300.0  2014-12-01

# 按date聚合
group = df.groupby('date')

# 计算Weighted_Price列的平均值
mean_price = group['Weighted_Price'].mean()

# 转换为DataFrame
df = pd.DataFrame(mean_price)
print(df.head())

            Weighted_Price
date
2014-12-01      366.775068
2014-12-02      375.943001
2014-12-03      377.882701
2014-12-04      377.991743
2014-12-06      378.000000

随机打乱DataFrame

from sklearn.utils import shuffle

df = pd.read_csv("in_file")
print(df.head())

    Timestamp  Weighted_Price
0  1417411980           300.0
1  1417412040           300.0
2  1417412100           300.0
3  1417412160           300.0
4  1417412220           300.0

df = shuffle(df)
print(df.head())

          Timestamp  Weighted_Price
73203    1425305400      260.685737
8789     1421332380      150.000000
24615    1422390120      263.547273
1357887  1502386440     3417.436340
1073833  1485343200      895.790112
Nevermore Written by:

步步生姿,空锁满庭花雨。胜将娇花比。